home *** CD-ROM | disk | FTP | other *** search
- /**** shape.c ****/
- /* By Paul Field
- * See !ReadMe file for distribution/modification restrictions
- */
-
- #include "shape.h"
-
- static euclid_coord vertex[8]; /* Vertices of the cube */
-
- static euclid_coord *face[6][4] = /* Pointers to the vertices making up each face */
- { { &vertex[0], &vertex[1], &vertex[3], &vertex[2] },
- { &vertex[0], &vertex[4], &vertex[5], &vertex[1] },
- { &vertex[0], &vertex[2], &vertex[6], &vertex[4] },
- { &vertex[2], &vertex[3], &vertex[7], &vertex[6] },
- { &vertex[3], &vertex[7], &vertex[5], &vertex[1] },
- { &vertex[7], &vertex[6], &vertex[4], &vertex[5] }
- };
-
- os_error *shape_makecube(euclid_header *h, unsigned int size, euclid_solid **cube)
- { os_error *e;
-
- if ((e = euclid_create(6, h, eid_solid, cube))==NULL)
- { int fno, vno;
- euclid_coord *v;
-
- (*cube)->boundingradius = +(17321 * size)/10000; /* size * sqrt(3) */
- /* euclid_create makes boundingcentre = {0,0,0} */
-
- size /= 2;
- for (vno = 0, v = vertex; vno < 8; vno++, v++)
- { v->x = (vno % 2 == 0) ? size : -size;
- v->y = (vno % 8 < 4) ? size : -size;
- v->z = (vno % 4 >= 2) ? size : -size;
- }
-
- for (fno = 0; fno <= 5 && !e; fno++)
- { euclid_plane *p;
-
- if ((e = euclid_create(4, h, eid_plane, &p)) == NULL)
- { euclid_coord *points, **fpoints;
- int cno;
-
- (*cube)->var[fno].plane = p;
- points = p->point;
- fpoints = face[fno];
- for (cno = 3; cno >= 0; cno--)
- { *points++ = **fpoints++;
- }
- }
- }
- if (e)
- { for (--fno; fno >= 0; fno--)
- { euclid_destroy(h, (*cube)->var[fno].plane);
- }
- euclid_destroy(h, *cube);
- }
- }
- return(e);
- }
-